home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / VideoToolbox 96.06.15 / VideoToolboxSources / Require.c < prev    next >
Text File  |  1995-07-26  |  6KB  |  148 lines

  1. /*
  2. Require.c
  3.  
  4. Require(long quickDrawVersion);
  5. checks that the computer is providing the environment that your program needs
  6. (cpu, fpu, and quickDraw), and fails gracefully if not. Also checks for
  7. consistency of sizeof int and double among this program, the (possibly precompiled)
  8. VideoToolbox.h header, and the Standard C library (i.e. "ANSI"). 
  9.  
  10. Call this at the beginning of your main program, so that your program will
  11. fail gracefully--instead of crashing--when someone runs it on a computer
  12. that lacks what your program needs, or when you've accidentally set up
  13. inconsistent compiler options among the various parts of your project. All
  14. tests automatically track your current compiler settings.
  15.  
  16. Here are the versions of quickdraw, as of System 7.1:
  17.  
  18.  gestaltOriginalQD = 0x000,                        // original 1-bit QD
  19.  gestalt8BitQD = 0x100,                            // 8-bit color QD
  20.  gestalt32BitQD = 0x200,                        // 32-bit color QD
  21.  gestalt32BitQD11 = 0x210,                        // 32-bit color QDv1.1
  22.  gestalt32BitQD12 = 0x220,                        // 32-bit color QDv1.2
  23.  gestalt32BitQD13 = 0x230,                        // 32-bit color QDv1.3
  24.  
  25. QDv1.3, which is in System 7.0, is the first version of QuickDraw in which the
  26. Apple Toolbox call GetPixBaseAddr() works correctly; earlier versions return
  27. garbage.
  28.  
  29.      ==================================================================
  30.      ROM Class             System Version       Gestalt Value
  31.      ------------------------------------------------------------------
  32.      Black-and-white class <  7.0               gestaltOriginalQD
  33.      (ROM < 256K)          >= 7.0               gestaltOriginalQD
  34.                                       and gestaltSystemVersion >= $0700
  35.  
  36.      Color QD class        <  7.0, no INITs     gestalt8BitQD
  37.      (ROM = 256K)          6.0.3/6.0.4 and      gestalt32BitQD
  38.                            32-Bit QD INIT 1.0
  39.                            6.0.5-6.0.8 and      gestalt32BitQD12
  40.                            32-Bit QD INIT 1.2
  41.                            >= 7.0               gestalt32BitQD13
  42.  
  43.      ci class              6.0.4                gestalt32BitQD + 1
  44.      (ROM > 256K)          6.0.5-6.0.8          gestalt32BitQD12
  45.                            >= 7.0               gestalt32BitQD13
  46.      ==================================================================
  47.      (Source: Develop Issue 14, June 1993)
  48.  
  49. The types SCANF_INT, PRINTF_INT, SCANF_DOUBLE, and PRINTF_DOUBLE are for 
  50. compatibility with MATLAB. When MATLAB is false they're just int and double.
  51. We check both sprintf and sscanf since those are the most likely to break
  52. if the MATLAB interface isn't set up correctly. When MATLAB is false this
  53. is overkill, but does confirm that the ANSI library is compatible with the
  54. current compiler options.
  55.  
  56. HISTORY:
  57. 2/20/93    dgp    Wrote it, motivated by a conversation with David Brainard.
  58. 9/8/93    dgp    Enhanced to check for inconsistent sizes of int and double.
  59. 9/13/93    dgp Moved Require to its own file.
  60. 5/8/95 dgp Make sure that fpu test works ok by moving all the fpu code to separate subroutine. 
  61. Otherwise the compiler may put instructions to access the fpu at the beginning of Require, 
  62. before we have a chance to test for presence of the fpu.
  63. */
  64. #include "VideoToolbox.h"
  65. static void RequireConsistency(void);
  66.  
  67. void Require(long quickDrawVersion)
  68. {
  69.     #if MAC_C
  70.         long value;
  71.         int error;
  72.  
  73.         value=0;
  74.         error=Gestalt(gestaltFPUType,&value);
  75.         if(error)PrintfExit("Sorry, I require Gestalt(). Your System is too old!\n");
  76.         if(GENERATING68881 && value==0)
  77.             PrintfExit("Sorry. I've been compiled to use a floating point chip,"
  78.                 " and you don't have one.\n");
  79.         value=0;
  80.         error=Gestalt(gestaltProcessorType,&value);
  81.         if(GENERATING68020 && value<gestalt68020)
  82.             PrintfExit("Sorry. I've been compiled to use a 68020 processor (or better),"
  83.                 " and you don't have one.\n");
  84.         Gestalt(gestaltQuickdrawVersion,&value);
  85.         if(value<quickDrawVersion)switch(quickDrawVersion){
  86.             case gestalt8BitQD:
  87.                 PrintfExit("Sorry. This program requires Color QuickDraw.\n");
  88.             default:
  89.                 PrintfExit("Sorry. This program requires 32-bit QuickDraw version 1.%ld\n"
  90.                     ,(long)(quickDrawVersion-gestalt32BitQD)/0x10);
  91.         }
  92.     #endif
  93.     RequireConsistency();
  94. }
  95.  
  96. static void RequireConsistency(void)
  97. {
  98.     short inconsistent;
  99.     SCANF_INT n[3];
  100.     SCANF_DOUBLE a[5];
  101.     char s[16];
  102.     static char programVsLibrary[]=
  103.         "Oops. %s error. This program and the Standard C “ANSI” library have been\n"
  104.         "compiled with incompatible %s.\n";
  105.  
  106.     inconsistent=0;
  107.     if(sizeof(int)!=sizeof(struct PrecompileSizeofInt)){
  108.         inconsistent=1;
  109.         printf("Oops. "
  110.         "The VideoToolbox.h header has been precompiled with a different size\n"
  111.         "of int.\n");
  112.     }
  113.     sprintf(s,"%d,%d",(PRINTF_INT)1,(PRINTF_INT)-1);
  114.     if(strcmp(s,"1,-1")!=0){
  115.         inconsistent=1;
  116.         printf(programVsLibrary,"sprintf","sizes of int");
  117.     }
  118.     n[2]=1;
  119.     sscanf("1,-1","%d,%d",&n[0],&n[1]);
  120.     if(n[0]!=1 || n[1]!=-1 || n[2]!=1){
  121.         inconsistent=1;
  122.         printf(programVsLibrary,"sscanf","sizes of int");
  123.     }
  124.     sprintf(s,"%g,%g",(PRINTF_DOUBLE)1.0,(PRINTF_DOUBLE)0.1);
  125.     if(strcmp(s,"1,0.1")!=0){
  126.         inconsistent=1;
  127.         printf(programVsLibrary,"sprintf","formats for double");
  128.         //printf("“%s”≠“%s”\n",s,"1,0.1");
  129.         assert(sizeof(PRINTF_DOUBLE)==sizeof(double));
  130.     }
  131.     a[2]=1.0;
  132.     sscanf("1,0.1","%lf,%lf",&a[0],&a[1]);
  133.     if(a[0]!=1.0 || a[1]!=(SCANF_DOUBLE)0.1 || a[2]!=1.0){
  134.         inconsistent=1;
  135.         printf(programVsLibrary,"sscanf","formats for double");
  136.         //printf("“%s”≠“%f,%f,%f”\n","1,0.1,1",a[0],a[1],a[2]);
  137.         assert(sizeof(SCANF_DOUBLE)==sizeof(double));
  138.     }
  139.     if(sqrt(0.1*0.1)!=0.1){
  140.         inconsistent=1;
  141.         printf("Oops: sqrt(0.1*0.1)!=0.1\n"
  142.         "Perhaps this program and the Standard C “ANSI” library have been\n"
  143.         "compiled with incompatible formats for double.\n");
  144.     }
  145.     if(inconsistent)PrintfExit("");    /* Use empty string since stdio may be flakey. */
  146. }
  147.  
  148.